//
//  HMHomeViewModel.swift
//  WeiBoSwift
//
//  Created by hgj on 2016/11/17.
//  Copyright © 2016年 HuGuoJian. All rights reserved.
//  网络请求的方法,得到网络数据  封装到视图模型中
//  将数据处理成模型数据
//  本视图模型只处理tableView 数据 
//  模型数组

import UIKit
import SDWebImage

class HMHomeViewModel: NSObject {
    
    // 懒加载 实例化一个模型数组(视图模型)
    lazy var viewModelArray: [HMStatusesViewModel] = [HMStatusesViewModel]()

    // 对象方法  网络加载数据
    func loadData(isPullup: Bool, finished: @escaping (Bool,Int) -> ()) {
    
//        let urlStr = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        if isPullup {
            //上拉
            maxId = viewModelArray.last?.statues?.id ?? 0
            if maxId != 0 {
                maxId -= 1 // 为了不重复出现两个一样的cell
            }
        } else {
            sinceId = viewModelArray.first?.statues?.id ?? 0
        }
        
        
        HMStatusDAL.loadHomeData(sinceId: sinceId, maxId: maxId) { (array) in
            
            // 本地请求失败
            if array == nil {
                finished(false,0)
                return
            }
            
            var tempArray = [HMStatusesViewModel]()
            for item in array! {
                let viewmodel = HMStatusesViewModel()
                let s = HMStatuses()
                
                // 字典转模型
                s.yy_modelSet(with: item)
                viewmodel.statues = s
                
                // 计算和行高 加载的时候计算  不然会多次计算
                let cell = self.loadCell(viewmodel: viewmodel)
                cell.viewModel = viewmodel
                
                cell.layoutIfNeeded()
                
                viewmodel.rowHeight = cell.toolBar.frame.maxY
                tempArray.append(viewmodel)
            }
            if isPullup {
                //上拉加载更多数据 追加
                self.viewModelArray = self.viewModelArray + tempArray
            } else {
                //初次的时候直接赋值 或者 下拉刷新的时候 执行插入到前面操作
                self.viewModelArray = tempArray + self.viewModelArray
            }
            
            finished(true,tempArray.count)
            self.cacheStatusSingleImage(array: tempArray, finished: finished)
        }
    }
    
    
    
    
    
    
//        let parameters = ["access_token" : HMUserAccountViewModel.shared.access_token,"max_id" : "\(maxId)","since_id" : "\(sinceId)"]
//        
//        
//        
//        HMNetworkTools.shared.request(method: .GET, urlString: urlStr, parameters: parameters) { (reponse, error) in
//            
//            if error != nil {
//                finished(false,0)
//                return
//            }
//            //
//            let dict = reponse as! [String : Any]
//            
//            // 转为字类型的数组  有可能dict["statuses"]里面有其他类型 所以?
//            guard let array = dict["statuses"] as? [[String : Any]] else {
//                 finished(false,0)
//                return
//            }
//            
//            var tempArray = [HMStatusesViewModel]()
////            var tempArray = NSArray.yy_modelArray(with: HMStatuses.self, json: array) as! [HMStatuses]
//            //
//            for item in array {
//                
//                // 利用YYModel字典转模型
//                let model = HMStatuses()
//                model.yy_modelSet(with: item)
//                
//                //
//                let viewModel = HMStatusesViewModel()
//                viewModel.statues = model
//                
//                tempArray.append(viewModel)
//            }
//            

//    }

    
    //缓存单张图片
    private func cacheStatusSingleImage(array: [HMStatusesViewModel],finished: @escaping (Bool,Int) -> ()) {
        if array.count == 0 {
            //一定要执行回调
            finished(true, 0)
            return
        }
        
        //遍历视图模型
        //使用调度组 入组和出组必须成对出现,没有出组不会执行回调
        let group = DispatchGroup()
        for viewmodel in array {
            if viewmodel.imageURLs?.count == 1 {
                //只有一张图图片
                //执行下载图片的操作
                //异步任务 希望所有的异步任务执行完毕之后再执行回调
                //在开始异步任务之前 执行入组的操作 ,调度组中的异步任务 + 1
                group.enter()
                let url = URL(string: viewmodel.imageURLs?.first?.wap360 ?? "")
                //.retryFailed 就可能导致程序崩溃
                SDWebImageManager.shared().downloadImage(with:url, options: [], progress: nil, completed: { (_, _, _, _, _) in
//                    print("----单张图片下载成功")
                    //
                    //finished(true, array.count)
                    //出组, 标识调度组中的异步任务 -1
                    group.leave()
                })
            }
        }
        //执行统一的回调
        group.notify(queue: DispatchQueue.main, execute: {
//            print("----所有的单张图片都下载完毕")
            finished(true, array.count)
        })
    }
    
    private func loadCell(viewmodel: HMStatusesViewModel) -> HMStatuesCell {
        return (viewmodel.statues?.retweeted_status == nil) ? originalCell : retweetedCell
    }
}
